/*
 * Main_NSGA.java
 *
 * Created on 21-nov-2007, 17:44:53
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia;


import java.util.*;

/**
 *
 * @author Arturo Ferreira
 * @author Manuel Avalos
 */
public class Main_NSGA {
    public Vector MejorFrente= new Vector();
    /**
     * Indica la condicion de parada, la mayor cantidad de generaciones.
     */
    public static final double Max_Generaciones=10.0;
    public Archivo archivo;
    /**
     * @param args the command line arguments
     */
   public static void main(String[] args) {
       Vector MejorFrente= new Vector();
       Main_NSGA principal=new Main_NSGA();
        for (int i = 0; i < 10; i++) {
            long inicio = System.currentTimeMillis();
            principal.correr_NSGA();
            long fin = System.currentTimeMillis();
            System.out.println("Tiempo transcurrido corrida "+(i+1)+"= "+((fin-inicio)/60000.0));
            MejorFrente.addAll(principal.MejorFrente);
        }
       MejorFrente=Poblacion.BuscarNoDominados(MejorFrente);
       principal.ImprimirFrente(MejorFrente);
       MetricaDistribucion M2= new MetricaDistribucion(MejorFrente);
        System.out.println("*************************La metrica de Distribucion es = "+M2.calcularMetrica()+"*****************************");
        MetricasExtension m3 = new MetricasExtension();        
        double resultadoM3 = m3.CalcularMetricaExtension(MejorFrente);
        System.out.println("*************************La metrica de Extension es = "+resultadoM3+"*****************************");
   }

    public Main_NSGA() {
        archivo = new Archivo();
         try {
            archivo.leer("C:\\Documents and Settings\\Ramon\\Escritorio\\instanciasPortFolioSelection\\us_dj_ind_avg-2001-2006.sd");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
      
   public void correr_NSGA() {

        int generacion = 0;
        
        Vector frente_paretoG;
       
        Poblacion poblacion = new Poblacion();
        poblacion.GenerarPoblacion(archivo.getPoblacion(), archivo.getActivos());
        poblacion.calcularValorObjetivo(archivo.getCovarianza(),archivo.getRendimiento());
        
        do {
            System.out.println((generacion/this.Max_Generaciones)*100+"%" );
            generacion++;
            frente_paretoG = poblacion.AsignarFitness_NSGA();
            
            this.guardarMejoresSoluciones(frente_paretoG);
            
            poblacion.seleccionYevolucion_NSGA(archivo.getRendimiento(), archivo.getCovarianza());
            poblacion.setVariables(); //Inicializo las variables que guardan a los peores individuos
        } while (generacion <= this.Max_Generaciones);
        
        frente_paretoG = poblacion.AsignarFitness_NSGA();
        guardarMejoresSoluciones(frente_paretoG);


        
    }
    public void guardarMejoresSoluciones(Vector newFrente)
    {
        if(this.MejorFrente.size()==0)
        {
            this.MejorFrente.addAll(newFrente);
        }else
        {
            //Agrego las nuevas soluciones y luego saco las no dominadas entre las mejores.
            this.MejorFrente.addAll(newFrente);
            this.MejorFrente=Poblacion.BuscarNoDominados(this.MejorFrente);
        }
    }
    public void ImprimirFrente(Vector Frente)
    {
        //Para no imprimir los repetidos
        boolean repetido;
        Vector frenteNoRepetido=new Vector();
        for (int i = 0; i < Frente.size(); i++) {
            repetido=false;
            Individuo individuo_i = (Individuo) Frente.elementAt(i);
            for (int j = 0; j < frenteNoRepetido.size(); j++) {
                Individuo individuo_j = (Individuo) frenteNoRepetido.elementAt(j);
                if (individuo_i.igual(individuo_j)) {
                    repetido = true;
                    break;
                }
            }
            if (!repetido) {
                frenteNoRepetido.addElement(individuo_i);
            }
        }
        for (int i = 0; i < frenteNoRepetido.size(); i++) {
            Individuo individuo_i = (Individuo) frenteNoRepetido.elementAt(i);
            System.out.println("[" + i + "]" +  "     " + individuo_i.toStringVecObjetivo() + " ");
        }
    }
    
}
